package com.edu.zql;

/**
 * Created by User on 2017/10/11.
 */
public class 浮点 {


    public static void main(String[] args) {
        System.out.println(3 * 3.2);
        String convert = convert(25.125f);
        System.out.println(convert); //01000001110010010000000000000000
        // 0 10000011 11001.0010000000000000000

        Float f = decimalBinaryToDecimal("0010000000000000000");
        System.out.println(f);// 0.125
    }

    private static void testConvert() {

        // 有关浮点数，根据IEEE745，计算11000001000100000000000000000000的单精度浮点的值，并给出计算过程。
        // 分解成 1 10000010  00100000000000000000000   （一个 八个  二十三个）
        // -1^1 表示负数
        // 10000010分解成 1 0000010 这里的1表示正数 0000010表示2  （要加一）  +3
        // 00100000000000000000000 就是二进制小数 1.00100000000000000000000 小数点右移+3位
        // 1001.00000000000000000000 = 9.0
        // -9


        int i = Float.floatToRawIntBits(-9f);
        System.out.println(i);

        System.out.println(convert(-9f));
    }

    public static String convert(float num) {
        int intVal = Float.floatToIntBits(num);
        return intVal > 0 ? "0" + Integer.toBinaryString(intVal) : Integer
                .toBinaryString(intVal);
    }


    // 小数部分  小数二进制转换成小数 0010000000000000000-->0.125
    public static Float decimalBinaryToDecimal(String decimalBinary) {
        int i = Integer.parseInt( "1" + decimalBinary, 2);
        Float r = 0f;
        for (int j = 0; j < 30; j++) {
            if ((1 << j + 1) > i) break;
            if ((i & (1 << j)) > 0) {
              r += 1;
            }
            r /= 2;
        }

        return r;
    }

}
